/*
 *  Copyright 2001-2004 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package ar.uba.fi.posgrado.common.dao;

import java.util.List;

import ar.uba.fi.posgrado.common.exception.InvalidArgumentException;
import ar.uba.fi.posgrado.common.exception.MissingArgumentException;
import ar.uba.fi.posgrado.common.model.Role;
import ar.uba.fi.posgrado.common.model.User;

/**
 * Interfaz DAO para manejar usuarios.<br>
 * No se maneja integrada con las demas por la estructura de 
 * la tabla (no tiene ID numerico como el resto).<br>
 * 
 * @author nicolas.gonzalez
 */
public interface UserDAO {

    /** Persiste la instancia<br>
     * 
     * @param user Instancia a persistir
     * @throws MissingArgumentException En caso de recibir null
     * @throws DAOException Error de conexion o SQL */
    public void save(User user) throws InvalidArgumentException, MissingArgumentException, DAOException;
    

    /** Borra una instancia<br>
     * 
     * @param user Objecto a remover
     * @throws MissingArgumentException En caso de recibir null
     * @throws DAOException Error de conexion o SQL */
    public void remove(User user) throws MissingArgumentException, DAOException;
    
    /**
     * Modifica un usuario, lo q implica cambio en sus roles.<br>
     * 
     * @param user
     * @throws MissingArgumentException
     * @throws DAOException
     */
    public void update(User user) throws MissingArgumentException, DAOException;
    
    /**
     * Busca todos los usuarios de la aplicacion.<br>
     * @return Los usuarios
     * @throws DAOException En caso de error
     */
    public List<User> findAll() throws DAOException;
    
    /**
	 * Devuelve los roles disponibles para el usuario teniendo en cuenta
	 * aquellos que YA tiene.<br>
	 * 
	 * @param user
	 * @return Una {@link List lista} de {@link Role roles}
	 * @throws InvalidArgumentException
	 * @throws MissingArgumentException
	 * @throws DAOException
	 */
    public List<Role> getAvailableRoles(User user) throws InvalidArgumentException, MissingArgumentException, DAOException;

    /**
     * Busca un usuario por nombre.<br>
     * @return Un {@link User usuario}
     * @throws NoSuchEntityException En caso de no existir
     * @throws DAOException En caso de error
     */
    public User findByName(String userName) throws NoSuchEntityException, DAOException;
    
    /**
     * Busca los roles y devuelve por cada uno una instancia de rol.<br>
     * @param roleNames
     * @return Una {@link List lista} de {@link Role roles}
     * @throws DAOException En caso de error
     */
    public List<Role> findRolesByName(List<String> roleNames) throws DAOException;
    
    /**
     * Busca todos los roles.<br>
     * @return Una {@link List lista} con {@link Role roles} del sistema
     * @throws DAOException
     */
    public List<Role> findAllRoles() throws DAOException;

}
